home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / 7up_pd / pcvstar2.s < prev    next >
Text File  |  1998-10-29  |  8KB  |  412 lines

  1. *      PCVSTART.S
  2. *
  3. *      Pure C Startup Code
  4. *
  5. *      Copyright (c) Borland International 1988/89/90
  6. *      All Rights Reserved.
  7.  
  8.  
  9. *>>>>>> Information <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  10.  
  11. *        This version of PCSTART.S handles extended argument
  12. *        passing via the ARGV= environment variable.
  13.  
  14.  
  15. *>>>>>> Export references <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  16.  
  17.         .EXPORT exit, __exit
  18.  
  19.         .EXPORT _BasPag
  20.         .EXPORT _app
  21.         .EXPORT errno
  22.         .EXPORT _AtExitVec, _FilSysVec
  23.         .EXPORT _RedirTab
  24.         .EXPORT _StkLim
  25.         .EXPORT _PgmSize
  26.  
  27.         .EXPORT __text, __data, __bss
  28.  
  29. *>>>>>> Import references <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  30.  
  31.         .IMPORT main
  32.         .IMPORT _fpuinit
  33.         .IMPORT _StkSize
  34.         .IMPORT _FreeAll
  35.  
  36.  
  37.  
  38.  
  39. *>>>>>> Data structures <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  40.  
  41.  
  42. * Base page structure
  43.  
  44.         .OFFSET 0
  45.  
  46. TpaStart:
  47.         .DS.L   1
  48. TpaEnd:
  49.         .DS.L   1
  50. TextSegStart:
  51.         .DS.L   1
  52. TextSegSize:
  53.         .DS.L   1
  54. DataSegStart:
  55.         .DS.L   1
  56. DataSegSize:
  57.         .DS.L   1
  58. BssSegStart:
  59.         .DS.L   1
  60. BssSegSize:
  61.         .DS.L   1
  62. DtaPtr:
  63.         .DS.L   1
  64. PntPrcPtr:
  65.         .DS.L   1
  66. Reserved0:
  67.         .DS.L   1
  68. EnvStrPtr:
  69.         .DS.L   1
  70. Reserved1:
  71.         .DS.B   7
  72. CurDrv:
  73.         .DS.B   1
  74. Reserved2:
  75.         .DS.L   18
  76. CmdLine:
  77.         .DS.B   128
  78. BasePageSize:
  79.         .DS     0
  80.  
  81.  
  82.  
  83. *>>>>>>> Data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  84.  
  85.         .BSS
  86. __bss:
  87.  
  88. * Pointer to base page
  89.  
  90. _BasPag:
  91.         .DS.L   1
  92.  
  93.  
  94. * Applikation flag
  95.  
  96. _app:
  97.         .DS.W   1
  98.  
  99.  
  100. * Stack limit
  101.  
  102. _StkLim:
  103.         .DS.L   1
  104.  
  105. * Program size
  106.  
  107. _PgmSize:
  108.         .DS.L   1
  109.  
  110. * Redirection address table
  111.  
  112. _RedirTab:
  113.         .DS.L   6
  114.  
  115. *>>>>>>> Initialized data segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  116.  
  117.         .DATA
  118. __data:
  119.  
  120. * Global error variable
  121.  
  122. errno:
  123.         .DC.W   0
  124.  
  125.  
  126. * Vector for atexit
  127.  
  128. _AtExitVec:
  129.         .DC.L   0
  130.  
  131.  
  132. * Vector for file system deinitialization
  133.  
  134. _FilSysVec:
  135.         .DC.L   0
  136.  
  137.  
  138. *>>>>>>> Code segment <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  139.  
  140.         .CODE
  141. __text:
  142.  
  143.  
  144. ******** PcStart ********************************************************
  145.  
  146. Start:
  147.         BRA.B   Start0
  148.  
  149.  
  150.  
  151. ******* Configuration data
  152.  
  153.  
  154. * Redirection array pointer
  155.  
  156.         .DC.L   _RedirTab
  157.  
  158.  
  159. * Stack size entry
  160.  
  161.         .DC.L   _StkSize
  162.  
  163.  
  164.  
  165. ******* Pc library copyright note
  166.  
  167.         .ALIGN  16
  168.  
  169.         .DC.B   '>>>> PURE-C <<<<'
  170.         .DC.B   '  for ATARI-ST  '
  171.         .DC.B   '  Version  1.0  '
  172.         .DC.B   '(C)88-90 Borland'
  173.         .DC.B   ' International  '
  174.  
  175. EmpStr:
  176.         .DC.B   $00
  177.         .EVEN
  178.  
  179.  
  180.  
  181. ******** Pc startup code
  182.  
  183. * Setup pointer to base page
  184.  
  185. Start0:
  186.         MOVE.L  A0, A3
  187.         MOVE.L  A3, D0
  188.         BNE     ACC
  189.  
  190.         MOVE.L  4(A7), A3   ; BasePagePointer from Stack
  191.         MOVEQ.L #1, D0      ; Program is Application
  192.         BRA     APP
  193. ACC:
  194.         CLR.W   D0          ; Program is DeskAccessory
  195.  
  196. APP:
  197.  
  198.         MOVE.L  A3, _BasPag
  199.  
  200. * Setup applikation flag
  201.  
  202.         MOVE.W  D0,_app
  203.  
  204.  
  205. * Compute size of required memory
  206. * := text segment size + data segment size + bss segment size
  207. *  + stack size + base page size
  208. * (base page size includes stack size)
  209.  
  210.         MOVE.L  TextSegSize(A3),A0
  211.         ADD.L   DataSegSize(A3),A0
  212.         ADD.L   BssSegSize(A3),A0
  213.         ADD.W   #BasePageSize,A0
  214.         MOVE.L  A0, _PgmSize
  215.  
  216. * Setup longword aligned application stack
  217.  
  218.         MOVE.L  A3,D0
  219.         ADD.L   A0,D0
  220.         AND.B   #$FC,D0
  221.         MOVE.L  D0,A7
  222.  
  223. * check application flag
  224.  
  225.         TST.W   _app
  226.         BEQ     Start8  * No environment and no arguments
  227.  
  228. * Free not required memory
  229.  
  230.         MOVE.L  A0,-(A7)
  231.         MOVE.L  A3,-(A7)
  232.         MOVE.W  #0,-(A7)
  233.         MOVE.W  #74,-(A7)
  234.         TRAP    #1
  235.         LEA.L   12(A7),A7
  236.  
  237. * scan environment
  238.  
  239.         MOVE.L    A7, D0
  240.         SUB.L   #_StkSize-4, D0
  241.         AND.B   #$FC, D0
  242.         MOVE.L  D0, A1
  243.         MOVE.L  A1, A4                    * this is envp
  244.         MOVE.L  EnvStrPtr(A3), A2
  245.         MOVE.B    CmdLine(A3), D5
  246.         MOVE.B    #'=', D6
  247.         MOVE.L    #'VGRA', D7
  248.         MOVEA.L    A7, A6
  249.  
  250. ScanEnvLoop:
  251.         MOVE.L  A2, (A1)+
  252.         MOVEA.L    A2, A5
  253.         TST.B   (A2)+
  254.         BEQ        ScanEnvExit
  255. Start1:
  256.         TST.B   (A2)+
  257.         BNE     Start1
  258.  
  259.         MOVE.B    (A5)+, -(A6)
  260.         MOVE.B    (A5)+, -(A6)
  261.         MOVE.B    (A5)+, -(A6)
  262.         MOVE.B    (A5)+, -(A6)
  263.         CMP.L    (A6)+, D7        * ARGV ?
  264.         BNE        ScanEnvLoop
  265.         CMP.B    (A5), D6        * ARGV= ?
  266.         BNE        ScanEnvLoop
  267.         CMP.B    #127, D5        * commandLength == 127 ?
  268.         BNE        ScanEnvLoop
  269.  
  270.         * now we have found extended arguments
  271.         CLR.B    -4(A5)
  272.         CLR.L    -4(A1)
  273.         MOVE.L    A1, A5            * this is argv
  274.         CLR.L    D3                * this is argc        
  275.         MOVE.L    A2, (A1)+
  276.  
  277. xArgLoop:
  278.         TST.B    (A2)+
  279.         BNE        xArgLoop
  280.         MOVE.L    A2, (A1)+
  281.         ADDQ.L    #1, D3
  282.         TST.B    (A2)
  283.         BNE        xArgLoop                
  284.         MOVE.L    A1, A6            * stack limit
  285.         CLR.L    -(A1)
  286.         BRA        Start8            * we don't need to parse basepage's tail
  287.  
  288. ScanEnvExit:
  289.         MOVE.L    A1, A6            * stack limit
  290.         CLR.L   -(A1)
  291.  
  292. * scan commandline
  293.         LEA     CmdLine(A3), A0
  294.         MOVE    #1, D3
  295.         MOVE.B  (A0), D1
  296.         EXT.W   D1
  297.         LEA     1(A0, D1.W), A1
  298.         CLR.B   (A1)
  299.         CLR.l   -(A7)           * argv[argc] = 0
  300.         BRA     Start5
  301.  
  302. Start2:                         * testing blank (seperator)
  303.         CMPI.B  #' '+1, (A1)
  304.         BPL     Start3
  305.         CLR.B   (A1)
  306.         TST.B   1(A1)
  307.         BEQ     Start3
  308.         PEA     1(A1)
  309.         ADDQ    #1, D3
  310.         BRA     Start5
  311.  
  312. Start3:                         * testing quotation marks
  313.         CMPI.B  #'"', (A1)
  314.         BNE     Start5
  315. ;        MOVE.B  #0, (A1)
  316.  
  317. Start4:                         * scan previous
  318.         SUBQ    #1, A1
  319.         CMPI.B  #'"', (A1)
  320.         DBEQ    D1, Start4
  321.         SUBQ    #1, D1
  322.         BMI     Start6
  323. ;        PEA     1(A1)
  324.         PEA     0(A1)
  325. ;        ADDQ    #1, D3
  326. ;        CLR.B   (A1)
  327.  
  328. Start5:
  329.         SUBQ.L  #1, A1
  330.         DBF     D1, Start2
  331.  
  332. Start6:
  333.         TST.B   1(A1)
  334.         BEQ     Start7
  335.         PEA     1(A1)
  336.         ADDQ    #1, D3
  337.  
  338. Start7:
  339.         PEA     EmpStr
  340.         MOVEA.L A7, A5
  341.  
  342. * Test if fpu 68881 is present
  343.  
  344. Start8:
  345.         JSR     _fpuinit
  346.  
  347. * calculate stack limit
  348.         LEA        256(A6), A6        * minimum stacksize to call library
  349.         MOVE.L    A6, _StkLim
  350.  
  351. ******* Execute main program *******************************************
  352. *
  353. * Parameter passing:
  354. *   <D0.W> = Command line argument count (argc)
  355. *   <A0.L> = Pointer to command line argument pointer array (argv)
  356. *   <A1.L> = Pointer to tos environment string (env)
  357.  
  358.         MOVE    D3, D0
  359.         MOVE.L  A5, A0
  360.         MOVE.L  A4, A1
  361.         JSR     main
  362.  
  363.  
  364.  
  365. ******** exit ***********************************************************
  366. *
  367. * Terminate program
  368. *
  369. * Entry parameters:
  370. *   <D0.W> = Termination status : Integer
  371. * Return parameters:
  372. *   Never returns
  373.  
  374. exit:
  375.         MOVE.W  D0,-(A7)
  376.  
  377. * Execute all registered atexit procedures
  378.  
  379.         MOVE.L  _AtExitVec,D0
  380.         BEQ     __exit
  381.  
  382.         MOVE.L  D0,A0
  383.         JSR     (A0)
  384.  
  385.  
  386. * Deinitialize file system
  387.  
  388. __exit:
  389.         MOVE.L  _FilSysVec,D0
  390.         BEQ     Exit1
  391.  
  392.         MOVE.L  D0,A0
  393.         JSR     (A0)
  394.  
  395.  
  396. * Deallocate all heap blocks
  397.  
  398. Exit1:
  399.         JSR     _FreeAll
  400.  
  401.  
  402. * Program termination with return code
  403.  
  404.         MOVE.W  #76,-(A7)
  405.         TRAP    #1
  406.  
  407.  
  408.  
  409. ******* Module end *****************************************************
  410.  
  411.         .END
  412. ə